﻿namespace Gentings.Extensions.Tagables
{
    /// <summary>
    /// 标签管理接口。
    /// </summary>
    /// <typeparam name="TTag">标签类型。</typeparam>
    /// <typeparam name="TTagIndex">标签索引类型。</typeparam>
    public interface ITagManager<TTag, TTagIndex> : ICachableObjectManager<TTag>
        where TTag : TagBase, new()
        where TTagIndex : TagIndexBase, new()
    {
        /// <summary>
        /// 通过名称获取标签Id。
        /// </summary>
        /// <param name="name">标签名称。</param>
        /// <returns>返回标签Id。</returns>
        int Find(string name);

        /// <summary>
        /// 通过名称获取标签Id。
        /// </summary>
        /// <param name="name">标签名称。</param>
        /// <returns>返回标签Id。</returns>
        Task<int> FindAsync(string name);

        /// <summary>
        /// 获取或者创建标签实例，并且返回标签对应的Id列表。
        /// </summary>
        /// <param name="tags">标签名称集合。</param>
        /// <param name="separator">分隔符。</param>
        /// <returns>返回标签对应的Id列表。</returns>
        List<int> GetOrCreate(string tags, char separator = ',');

        /// <summary>
        /// 获取或者创建标签实例，并且返回标签对应的Id列表。
        /// </summary>
        /// <param name="tags">标签名称集合。</param>
        /// <param name="separator">分隔符。</param>
        /// <returns>返回标签对应的Id列表。</returns>
        Task<List<int>> GetOrCreateAsync(string tags, char separator = ',');

        /// <summary>
        /// 执行统计清理服务。
        /// </summary>
        Task ExecuteAsync();
    }
}
